From: Keir Fraser Date: Mon, 6 Jul 2009 10:56:51 +0000 (+0100) Subject: AMD IOMMU: Make iommu suspend & resume functions more generic. X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~13641 X-Git-Url: https://dgit.raspbian.org/%22http:/www.example.com/cgi/%22https:/%22bookmarks://%22/%22http:/www.example.com/cgi/%22https:/%22bookmarks:/%22?a=commitdiff_plain;h=9699ac18569388ef08c175f056c6e627fe71c4ce;p=xen.git AMD IOMMU: Make iommu suspend & resume functions more generic. Signed-off-by: Wei Wang --- diff --git a/xen/drivers/passthrough/amd/pci_amd_iommu.c b/xen/drivers/passthrough/amd/pci_amd_iommu.c index 83e25ed231..ceee6009a5 100644 --- a/xen/drivers/passthrough/amd/pci_amd_iommu.c +++ b/xen/drivers/passthrough/amd/pci_amd_iommu.c @@ -441,4 +441,6 @@ struct iommu_ops amd_iommu_ops = { .update_ire_from_msi = amd_iommu_msi_msg_update_ire, .read_apic_from_ire = amd_iommu_read_ioapic_from_ire, .read_msi_from_ire = amd_iommu_read_msi_from_ire, + .suspend = amd_iommu_suspend, + .resume = amd_iommu_resume, }; diff --git a/xen/drivers/passthrough/iommu.c b/xen/drivers/passthrough/iommu.c index 51e15e5b09..b0dd91d66c 100644 --- a/xen/drivers/passthrough/iommu.c +++ b/xen/drivers/passthrough/iommu.c @@ -346,6 +346,20 @@ unsigned int iommu_read_apic_from_ire(unsigned int apic, unsigned int reg) return ops->read_apic_from_ire(apic, reg); } +void iommu_resume() +{ + struct iommu_ops *ops = iommu_get_ops(); + if ( iommu_enabled ) + ops->resume(); +} + +void iommu_suspend() +{ + struct iommu_ops *ops = iommu_get_ops(); + if ( iommu_enabled ) + ops->suspend(); +} + /* * Local variables: * mode: C diff --git a/xen/drivers/passthrough/vtd/iommu.c b/xen/drivers/passthrough/vtd/iommu.c index 72b76ce354..a0cf9d12d7 100644 --- a/xen/drivers/passthrough/vtd/iommu.c +++ b/xen/drivers/passthrough/vtd/iommu.c @@ -1848,7 +1848,7 @@ static int intel_iommu_group_id(u8 bus, u8 devfn) } static u32 iommu_state[MAX_IOMMUS][MAX_IOMMU_REGS]; -void iommu_suspend(void) +void vtd_suspend(void) { struct acpi_drhd_unit *drhd; struct iommu *iommu; @@ -1887,7 +1887,7 @@ void iommu_suspend(void) } } -void iommu_resume(void) +void vtd_resume(void) { struct acpi_drhd_unit *drhd; struct iommu *iommu; @@ -1934,6 +1934,8 @@ struct iommu_ops intel_iommu_ops = { .update_ire_from_msi = msi_msg_write_remap_rte, .read_apic_from_ire = io_apic_read_remap_rte, .read_msi_from_ire = msi_msg_read_remap_rte, + .suspend = vtd_suspend, + .resume = vtd_resume, }; /* diff --git a/xen/include/asm-x86/hvm/svm/amd-iommu-proto.h b/xen/include/asm-x86/hvm/svm/amd-iommu-proto.h index edc8968d35..6406321931 100644 --- a/xen/include/asm-x86/hvm/svm/amd-iommu-proto.h +++ b/xen/include/asm-x86/hvm/svm/amd-iommu-proto.h @@ -92,6 +92,10 @@ void amd_iommu_read_msi_from_ire( unsigned int amd_iommu_read_ioapic_from_ire( unsigned int apic, unsigned int reg); +/* power management support */ +void amd_iommu_resume(void); +void amd_iommu_suspend(void); + static inline u32 get_field_from_reg_u32(u32 reg_value, u32 mask, u32 shift) { u32 field; diff --git a/xen/include/xen/iommu.h b/xen/include/xen/iommu.h index 8300525286..3468ebcaaf 100644 --- a/xen/include/xen/iommu.h +++ b/xen/include/xen/iommu.h @@ -109,6 +109,8 @@ struct iommu_ops { void (*update_ire_from_msi)(struct msi_desc *msi_desc, struct msi_msg *msg); void (*read_msi_from_ire)(struct msi_desc *msi_desc, struct msi_msg *msg); unsigned int (*read_apic_from_ire)(unsigned int apic, unsigned int reg); + void (*suspend)(void); + void (*resume)(void); }; void iommu_update_ire_from_apic(unsigned int apic, unsigned int reg, unsigned int value);